#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QDebug>
#define info qDebug() << __LINE__ <<": "
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //监听套接字
    tcpServer = new QTcpServer(this);
    //监听
    tcpServer->listen(QHostAddress::Any,8888);
    setWindowTitle("服务器端口为：8888");
    //先将两个按钮置灰不可点击；
    ui->buttonFile->setEnabled(false);
    ui->buttonSend->setEnabled(false);
    //如果服务和套接字连接会触发newconnection
    connect(tcpServer,&QTcpServer::newConnection,
    [=]()
    {
        //取出建立好连接的套接字；
        tcpSocket = tcpServer->nextPendingConnection();
        //获取对方的IP和端口
        QString ip = tcpSocket->peerAddress().toString();
        quint16 port = tcpSocket->peerPort();
        QString str = QString("[%1:%2] 成功连接。").arg(ip).arg(port);
        QMessageBox::information(this,"Info",str);
        //成功连接后，可以选择文件
        ui->buttonFile->setEnabled(true);


    });
    connect(&timer,&QTimer::timeout,[=](){
        //关闭定时器
        timer.stop();
        //发送文件
        sendData();
    });
}

Widget::~Widget()
{
    delete ui;
}
//选择文件按钮
void Widget::on_buttonFile_clicked()
{
    QString filePath = QFileDialog::getOpenFileName(this,"Open File","../");//最后第四个参数默认是全部
    if(!filePath.isEmpty())
    {
        //路径有效
        fileName.clear();
        fileSize =0;
        QFileInfo fileInfo(filePath);
        //获取文件信息
        fileName = fileInfo.fileName();//文件名字
        fileSize =fileInfo.size(); //文件大小
        sendSize =0;
        //已只读方式打开
        file.setFileName(filePath);
        bool isOk = file.open(QIODevice::ReadOnly);
        if(!isOk)
        {
            info << "文件打开失败";
        }
        info << filePath;
        ui->buttonFile->setEnabled(false);
        ui->buttonSend->setEnabled(true);
    }
    else
    {
        info << "选择路径文件无效！";
    }
}

void Widget::on_buttonSend_clicked()
{
    //发送文件头 格式 文件名##文件大小
    QString head = QString("%1##%2").arg(fileName).arg(fileSize);
    //发送头部信息
    qint64 len = tcpSocket->write(head.toUtf8().data());
    if(len > 0)
    {
        //发送完文件信息
        //防止TCP黏包
        //需要通过定时器延迟 10ms以上
        timer.start(10);

    }
    else
    {
        info << "头部信息发送失败";
        file.close();
        ui->buttonFile->setEnabled(true);
        ui->buttonSend->setEnabled(false);
    }
    //在发送数据

}
void Widget::sendData()
{
    qint64 len =0;
    do
    {
       char buf[1024*4] ={0};
       len =0;
       //往文件中读数据
       len = file.read(buf,sizeof(buf));
       //发送数据 ，读多少 ，发多少
       len = tcpSocket->write(buf,len);
       //发送数据需要累积
       sendSize += len;
       //可以通过fileSize != sendSize 作为条件

    }while(len > 0);
    //判断是否发送完毕
    if(fileSize == sendSize)
    {
        QMessageBox::information(this,"Info","发送完毕");
        file.close();
        //把客户端断开
        tcpSocket->disconnectFromHost();
        //关闭
        tcpSocket->close();
    }
}


























